Jak zjistim, zda je TFrame na focused panelu?

Otázka od: Karel Kral

13. 9. 2004 14:41

Ahoj,
mam aplikaci, kde vlevo je TreeView pouzite jako menu a vpravo od nej
mam TPanel, na ktery dynamicky vkladam moduly - nasledniky TFrame -
podle toho, ktery uzel je vybrany.

Potreboval bych v tom modulu lezici vpravo od TreeView zjistit, zda je
prave Focused on nebo jiny objekt na obrazovce. Je jasne, ze TFrame
nemuze byt focused. Ale i Panel.Focused od panelu, ve kterem je vlozen
TFrame, mi vraci v kazde situaci false. Muzete mi nekdo poradit?
--
______________________________________________________
Karel Kral, vedouci odd. IT / IT manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________


Odpovedá: Karel Kral

14. 9. 2004 11:32

Karel Kral napsal(a):
> Ahoj,
> Potreboval bych v tom modulu lezici vpravo od TreeView zjistit, zda je
> prave Focused on nebo jiny objekt na obrazovce. Je jasne, ze TFrame
> nemuze byt focused. Ale i Panel.Focused od panelu, ve kterem je vlozen
> TFrame, mi vraci v kazde situaci false. Muzete mi nekdo poradit?

Odpovim si sam - udelal jsem to celkem snadno ale prijde mi, ze snad
musi existovat nejaka jednodussi cesta nez toto:

// vraci true, pokud v Container je obsazeno view, ktere je Focused.
// Pouziva se napr. na zjisteni, zda nektere z view, ktere lezi na danem
// TPanel je ve stavu Focused.
function ContainerHasFocus(Container: TWinControl): boolean;
var
   ParentForm: TCustomForm;

   // vraci formular, ve kterem je vlozen Container. Prochazi vlastniky tak
   // dlouho, az najde TCustomForm
   function FindParentForm: TCustomForm;
   var
     P: TWinControl;
   begin
     Result := nil;
     P := Container;
     while P <> nil do
     begin
       if P is TCustomForm then
       begin
         Result := TCustomForm(P);
         Break;
       end;
       P := P.Parent;
     end; // while
   end; // func

   // prochazi vlastniky Control tak dlouho, dokud nenarazi na
StopAtControl nebo
   // na konec. Vraci true, pokud je Control vlastneny StopAtControl
   function TraverseParents(Control, StopAtControl: TWinControl): boolean;
   var
     P: TWinControl;
   begin
     Result := false;
     P := Control;
     while P <> nil do
     begin
       if P = StopAtControl then
       begin
         Result := true;
         Break;
       end;
       P := P.Parent;
     end; // while
   end; // func

begin
   Result := false;
   ParentForm := FindParentForm;
   if Assigned(ParentForm) then
     Result := TraverseParents(ParentForm.ActiveControl, Container);
end;


--
______________________________________________________
Karel Kral, vedouci odd. IT / IT manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________


Odpovedá: Ondrej Kelle

14. 9. 2004 12:11

> Je jasne, ze TFrame nemuze byt focused.

Ako to, ze nie? TFrame je potomok TWinControl, ma window handle. Metody
SetFocus, Focused funguju podla ocakavania. Problem bude asi niekde inde.

HTH
TOndrej